package vip.liux.contracts.models.pay;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import vip.liux.contracts.shared.enums.pay.PayOrderStatus;
import vip.liux.domain.entities.auditing.CreationAuditedEntity;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;

@Getter
@Setter
@Accessors(chain = true)
@Entity
@Table(name = "pay_order")
public class PayOrder extends CreationAuditedEntity<Long> {
    /**
     * 应用编号
     * <p>
     * 关联 {@link PayApp#getId()}
     */
    private Long appId;
    /**
     * 渠道编号
     * <p>
     * 关联 {@link PayChannel#getId()}
     */
    private Long channelId;
    /**
     * 渠道编码
     * <p>
     * 枚举 {@link PayChannel}
     */
    private String channelCode;

    // ========== 商户相关字段 ==========

    /**
     * 商户订单编号
     * <p>
     * 例如说，内部系统 A 的订单号，需要保证每个 PayApp 唯一
     */
    private String merchantOrderId;

    /**
     * 商品标题
     */
    private String subject;

    /**
     * 商品描述信息
     */
    private String body;

    /**
     * 异步通知地址
     */
    private String notifyUrl;

    // ========== 订单相关字段 ==========

    /**
     * 支付金额，单位：元
     */
    private BigDecimal price;

    /**
     * 渠道手续费，单位：百分比
     * <p>
     * 冗余 {@link PayChannel#getFeeRate()}
     */
    private Double channelFeeRate;

    /**
     * 渠道手续金额，单位：元
     */
    private BigDecimal channelFeePrice;

    /**
     * 支付状态
     * <p>
     * 枚举 {@link PayOrderStatus}
     */
    private PayOrderStatus status;

    /**
     * 用户 IP
     */
    private String userIp;

    /**
     * 订单失效时间
     */
    private LocalDateTime expireTime;

    /**
     * 订单支付成功时间
     */
    private LocalDateTime successTime;

    /**
     * 支付成功的外部订单号
     */
    private String orderNo;

    // ========== 退款相关字段 ==========
    /**
     * 退款总金额，单位：元
     */
    private BigDecimal refundPrice;

    // ========== 渠道相关字段 ==========
    /**
     * 渠道用户编号
     * <p>
     * 例如说，微信 openid、支付宝账号
     */
    private String channelUid;

    /**
     * 渠道订单号
     */
    private String channelOrderNo;

    // ========== 其他字段 ==========

    /**
     * 支付渠道的额外参数
     * <p>
     * 参见 <a href="https://www.pingxx.com/api/支付渠道%20extra%20参数说明.html">参数说明</>
     */
    private Map<String, String> channelExtras;

    /**
     * 调用渠道的错误码
     */
    private String channelErrorCode;

    /**
     * 调用渠道报错时，错误信息
     */
    private String channelErrorMsg;

    /**
     * 支付渠道的同步/异步通知的内容
     * <p>
     * 对应 json
     */
    private String channelNotifyData;
}
